package fr.upmc.alasca.centreCalcul;

import java.util.ArrayList;
import java.util.List;

import fr.upmc.alasca.centreCalcul.externe.generateurDemandes.GenerateurDemandes;
import fr.upmc.alasca.centreCalcul.interne.controleurAdmission.ControleurAdmission;
import fr.upmc.alasca.centreCalcul.interne.machinePhysique.MachinePhysique;
import fr.upmc.components.cvm.AbstractCVM;

/**
 * @author Antoine Lavaire, Sabri Labassi, Thibaut Fleury, Ryme Fantazi
 */
public	class	CVM
extends			AbstractCVM
{
	protected static final String URI_MACHINE_PHYSIQUE = "Machine_Physique";
	protected static final String URI_CONTROLEUR_ADMISSION = "Controleur_Admission";




	/**
	 * Appelle le constructeur d'AbstractCVM en demandant explicitement la
	 * création d'un DynamicComponentCreator
	 */
	@Override
	public void deploy() throws Exception {
		List<String> listeUriMachinePhysique = new ArrayList<String>();

		// Déploiement des machines physiques de notre simulateur
		for(int i = 0; i < 4; i++) {
			String uri = URI_MACHINE_PHYSIQUE + "_" + i;

			MachinePhysique mp = new MachinePhysique(uri, false, 3, 1.5f, 3.0f);
			this.deployedComponents.add(mp);

			listeUriMachinePhysique.add(uri);
		}

		// Déploiement du controleur d'admission
		ControleurAdmission ca = new ControleurAdmission(
				URI_CONTROLEUR_ADMISSION, false, listeUriMachinePhysique, 1.5f, 3.0f);
		this.deployedComponents.add(ca);

		// Déploiement du générateur de demandes (d'application)
		GenerateurDemandes gd = new GenerateurDemandes(
				(Boolean)false,
				(Integer)5,			// Nombre d'applications
				(Long)1000L,		// Moyenne requêtes
				(Long)3000000000L,	// Moyenne instructions
				(Long)500000000L,	// Ecart type
				URI_CONTROLEUR_ADMISSION);
		this.deployedComponents.add(gd);

		ca.deploy();
		gd.deploy();

		super.deploy();
	}


	public static void main(String[] args) {
		CVM cvm = new CVM();

		try {
			System.out.println("Deploying...");
			cvm.deploy();

			System.out.println("Starting...");
			cvm.start();

			// Simulation durant 15 minutes
			// Thread.sleep(20000);
			Thread.sleep(15 * 60 * 1000);

			System.out.println("Ending...");
			cvm.shutdown();

			System.exit(0);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
